using System;
using System.Collections;
using Curriculum.Modelo.Clases;
using Modelo.Clases;
using Utiles;

namespace Curriculum.Services
{
	/// <summary>
	/// Summary description for ResultadoCalificacionBuilder.
	/// </summary>
	public class ResultadoConcursoBuilder
	{
		private ResultadoConcurso _resultadoConcurso;
		private IList _calificadores;
		private Hashtable _calificacionesCVDocente;		

		public ResultadoConcursoBuilder()
		{
			_calificadores = new ArrayList();
		}

		public void AgregarCalificador(CalificadorConcursoCVs calificador)
		{
			_calificadores.Add(calificador);
		}

		public ResultadoConcurso ObtenerResultadoConcurso()
		{
			ConstruirResultadoConcurso();
			return _resultadoConcurso;
		}

		public void InicializarAtributos()
		{
			_resultadoConcurso = new ResultadoConcurso();
			_calificacionesCVDocente = new Hashtable();
		}

		private void ConstruirResultadoConcurso()
		{						
			ResultadoCalificacionCV resultadoCalificacionActual;		
			InicializarAtributos();
		
			if (_calificadores != null)
			{
				foreach (CalificadorConcursoCVs calificador in _calificadores)
				{
					if (calificador.CalificacionesCV != null)
					{
						foreach (CalificacionCV calificacionCV in calificador.CalificacionesCV)
						{
							resultadoCalificacionActual = new ResultadoCalificacionCV();
							resultadoCalificacionActual.IdCurriculum = calificacionCV.Curriculum.Id;
							resultadoCalificacionActual.IdDocente = calificacionCV.Curriculum.Docente.Id;			
							resultadoCalificacionActual.NombreDocente = calificacionCV.Curriculum.Docente.Apellido + " , " + calificacionCV.Curriculum.Docente.Nombre;

							string docenteId =  calificacionCV.Curriculum.Docente.Id;
							AgregarItemResultACalificacionesCVDocente(resultadoCalificacionActual, docenteId, calificacionCV.Calificaciones, calificador.JuradosEnConcurso);
						}				
					}
				}	
	
				foreach (ResultadoCalificacionCV resultadoCalificacionCV in this._calificacionesCVDocente.Values)
				{
					_resultadoConcurso.agregarResultadosCalificacionCV(resultadoCalificacionCV);
				}
			}
		}

		private void OrdenarResultados()
		{
			if (_resultadoConcurso.ResultadosCalificacionCV != null)
			{
				((ArrayList)_resultadoConcurso.ResultadosCalificacionCV).Sort(new GenericComparer("PuntajeTotal",false));
			}
		}

		private ItemResultadoCalificacion CrearItemResultadoCalificacionPorDocente(IList calificacionesAntecedente, IList juradosEnConcurso)
		{
			ItemResultadoCalificacion item = new ItemResultadoCalificacion();
			int puntajeTotalItem = 0;

			item.agregarJurados(juradosEnConcurso);
												
			foreach (CalificacionAntecedente calificacionAntecedente in calificacionesAntecedente)
			{
				puntajeTotalItem += calificacionAntecedente.Puntaje;
			}

			item.PuntajeTotalItem = puntajeTotalItem;

			return item;
		}

		private void AgregarItemResultACalificacionesCVDocente(ResultadoCalificacionCV resultadoCalificacionActual, string docenteId, IList calificacionesAntecedente, IList juradosEnConcurso)
		{
			ItemResultadoCalificacion item = CrearItemResultadoCalificacionPorDocente(calificacionesAntecedente, juradosEnConcurso);
			
			if (this._calificacionesCVDocente[docenteId] != null)
			{
				((ResultadoCalificacionCV)this._calificacionesCVDocente[docenteId]).AddItemCalificacion(item);
				((ResultadoCalificacionCV)this._calificacionesCVDocente[docenteId]).PuntajeTotal += item.PuntajeTotalItem;
				resultadoCalificacionActual = null;
			}
			else
			{
				resultadoCalificacionActual.AddItemCalificacion(item);
				resultadoCalificacionActual.PuntajeTotal = item.PuntajeTotalItem;
				this._calificacionesCVDocente[docenteId] = resultadoCalificacionActual;
			}
		}
	}
}
